using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace UIDesigner
{
  //オプション クラスの命名規則に従って、変数名・定数名を文字変換するクラス
  class Converter
  {
    public static string IDConst(string win32ConstStr)
    {
      return ConvertConst(win32ConstStr, オプション.IDConstStyle);
    }
    public static string Const(string win32ConstStr)
    {
      return ConvertConst(win32ConstStr, オプション.ConstStyle);
    }
    public static string IntegerVariable(string googleStr)
    {
      return ConvertVariable(googleStr, オプション.VariableStyle, "n");
    }
    public static string StringVariable(string googleStr)
    {
      return ConvertVariable(googleStr, オプション.VariableStyle, "sz");
    }
   //private
    private static string ConvertConst(string win32ConstStr, ConstStyle constStyle)
    {
      switch (constStyle)
      {
        case ConstStyle.Win32:
          return win32ConstStr;
        case ConstStyle.Google:
          return ToGoogleConstString(win32ConstStr);
        default:
          Debug.Assert(false, "規則が不明です");
          break;
      }
      return win32ConstStr;
    }
    private static string ConvertVariable(string googleStr, VariableStyle variableStyle, string win32Prefix)
    {
      switch (variableStyle)
      {
        case VariableStyle.Win32:
          return ToWin32VariableString(googleStr, win32Prefix);
        case VariableStyle.Google:
          return googleStr;
        case VariableStyle.LowerCamel:
          return ToLowerCamelString(googleStr);
        default:
          Debug.Assert(false, "規則が不明です");
          break;
      }
      return googleStr;
    }
    private static string ToGoogleConstString(string win32ConstStr)
    {
      string str = "k";
      char c;
      bool is_head = true;
      for (int i = 0; i < win32ConstStr.Length; i++)
      {
        c = win32ConstStr[i];
        if (c == '_')
        {
          is_head = true;
        }
        else
        {
          if (is_head)
          {
            str += c;
            is_head = false;
          }
          else
          {
            str += char.ToLower(c);
          }
        }
      }
      return str;
    }
    private static string ToLowerCamelString(string googleStr)
    {
      string str = "";
      char c;
      bool is_head = false; // 最初は小文字のため、先頭ではない扱い
      for (int i = 0; i < googleStr.Length; i++)
      {
        c = googleStr[i];
        if (c == '_')
        {
          is_head = true;
        }
        else
        {
          if (is_head)
          {
            str += char.ToUpper(c);
            is_head = false;
          }
          else
          {
            str += c;
          }
        }
      }
      return str;
    }
    private static string ToWin32VariableString(string googleStr, string prefix)
    {
      string str = prefix;
      char c;
      bool is_head = true;
      for (int i = 0; i < googleStr.Length; i++)
      {
        c = googleStr[i];
        if (c == '_')
        {
          is_head = true;
        }
        else
        {
          if (is_head)
          {
            str += char.ToUpper(c);
            is_head = false;
          }
          else
          {
            str += c;
          }
        }
      }
      return str;
    }
  }
}
